今天來介紹第二部分,基本上就是教你如何實作,那就開始吧٩( 'ω' )و
確保你的 build.gradle(Module: app)
檔案中有RecyclerView的依賴,在新版的 Android Studio 專案中,通常已經包含在material
依賴裡面了:))
dependencies {
implementation 'androidx.recyclerview:recyclerview:1.3.2'
// 或者看到有使用 Material Components的話應該也可以,它裡面有包含了RecyclerView
// implementation 'com.google.android.material:material:1.12.0'
}
這個範例中我們只顯示字串,所以可以省略這一步。但如果你的項目是複雜的物件(例如聯絡人),你會建立一個像這樣的類別:
public class Contact {
private String name;
private String phoneNumber;
// Constructor, getters, and setters...
}
在 res/layout 資料夾下,建立一個新的 XML 檔案,這邊以list_item.xml
作範例
list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/item_textview"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
建立一個新的 Java 類別,這邊以MyAdapter.java 為範例
MyAdapter.java
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
private Context context;
private List<String> dataList;
//Adapter的建構子,傳入context和資料來源
public MyAdapter(Context context, List<String> dataList) {
this.context = context;
this.dataList = dataList;
}
//建立ViewHolder的實例
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//載入list_item.xml
View view = LayoutInflater.from(context).inflate(R.layout.list_item, parent, false);
return new MyViewHolder(view);
}
//負責將資料綁定到ViewHolder上
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
// 取得特定位置的資料
String data = dataList.get(position);
// 將資料設定到 ViewHolder 的 TextView 中
holder.textView.setText(data);
}
//回傳資料的總數
@Override
public int getItemCount() {
return dataList.size();
}
//ViewHolder類別,持有每個項目的View
public static class MyViewHolder extends RecyclerView.ViewHolder {
TextView textView;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
// 透過 itemView.findViewById 找到項目佈局中的 UI 元件
textView = itemView.findViewById(R.id.item_textview);
}
}
}
在你activity_main.xml中加入 RecyclerView,並在 MainActivity.java 中進行設定
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.java
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private MyAdapter myAdapter;
private List<String> sampleData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//找到RecyclerView
recyclerView = findViewById(R.id.recycler_view);
//準備資料
sampleData = new ArrayList<>();
for (int i = 1; i <= 30; i++) {
sampleData.add("項目 " + i);
}
//建立Adapter實例
myAdapter = new MyAdapter(this, sampleData);
//建立LayoutManager
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL); // 設定為垂直滾動
//為RecyclerView設定LayoutManager和Adapter
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(myAdapter);
}
}
處理點擊
處理 RecyclerView 的點擊事件,可以在Adapter
中定義一個 Interface
在 Adapter
中定義Interface
//在MyAdapter 類別中新增
public interface OnItemClickListener {
void onItemClick(int position);
}
private OnItemClickListener listener;
public void setOnItemClickListener(OnItemClickListener listener) {
this.listener = listener;
}
在onBindViewHolder
中設定點擊監聽
//在onBindViewHolder 方法中新增
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null) {
//使用getAdapterPosition() 獲取準確的位置
int position = holder.getAdapterPosition();
//確保位置有效
if (position != RecyclerView.NO_POSITION) {
listener.onItemClick(position);
}
}
}
});
在 Activity 中實作Interface
//在MainActivity.java的onCreate中
myAdapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() {
@Override
public void onItemClick(int position) {
String clickedItem = sampleData.get(position);
Toast.makeText(MainActivity.this, "你點擊了: " + clickedItem, Toast.LENGTH_SHORT).show();
}
});
RecyclerView就先介紹到這裡了,明天會來介紹別的,明天見Φ౪Φ